package utils.array;

/**
 * 使用数组实现固定 长度的队列
 */
public class Queue {
    // 数组实现
    private Object[] arr;
    // 添加元素位置标记
    private int pushi;
    // 弹出元素位置标记
    private int polli;
    // 用于记录当前占用了几个空间，最大空间是limit
    private int size;
    // 队列大小
    private final int limit;

    //构造方法
    public Queue(int limit) {
        this.arr = new Object[limit];
        pushi = 0;
        polli = 0;
        size = 0;
        this.limit = limit;
    }

    //队列中添加值value
    public void push(Object value) {
        if (size == limit) {
            throw new RuntimeException("栈满了，不能再push了");
        }
        // 占用空间+1；
        size++;
        // 当前位置指针存储值
        arr[pushi] = value;
        // 前置指针往下一个位置指；
        pushi = nextIndex(pushi);
    }


    //取出一个队列中的值
    public Object pop() {
        if (size == 0) {
            throw new RuntimeException("栈空了，不能再poll了");
        }
        //占用空间--
        size--;
        Object temp = arr[polli];
        arr[polli] = 0; // 回收，值置空
        polli = nextIndex(polli);
        return temp;
    }

    /**
     * 获取下一个位置索引
     *
     * @param i 遇到最大位置，直接跳到0，实现循环复用
     * @return
     */
    private int nextIndex(int i) {
        // limit-1是最后一个元素 ，如果到了最后一个元素，下一个就返回到0，否则，继续往下索引；
        return i < limit - 1 ? i + 1 : 0;
    }

    // 队列是否为空
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public String toString() {
        String str = "";
        for (int i = 0; i < arr.length; i++) {
            str += arr[i].toString() + ",";
        }
        return str;
    }
}
